基础算法 —— 递归算法

【概述】

  1. 递归算法:一种通过重复将问题分解为同类的子问题而解决问题的方法。
  2. 适用问题:解决结构自相似的问题。即:构成原问题的子问题与原问题在结构上相似,可以用类似的方法解决。
  3. 特点:反复执行、结束反复执行的条件
  4. 缺点:占用大量内存且不易阅读

【两个问题】

  1. 递归边界条件(递归终止条件):确定递归到何时终止,或者说,直接有解的情况。
  2. 递归模式(递归体):大问题是如何分解为小问题的。 

注:递归终止条件通常就是得出最小问题的解,并返回给他的调用者。

【间接递归与直接递归】

    1.直接递归调用:就是在函数f中直接调用函数f本身

    2.间接递归调用:就是在函数f1中调用另外一个函数f2,而该函数f2又调用了函数f1

【经典应用】

1.递归求和

void Sum(int n)
{
    if(n>1)
        return n+Sum(n-1);
    else
        return 1;
}

2.递归求阶乘

阶乘的递归公式:

F(n)=\left\{\begin{matrix}1,n=0 \\ n*F(n-1),n\geq 0 \end{matrix}\right.

int F(int n)  
{  
    if(n==0)
        return 1;  
    return n*F(n-1);
}

3.斐波那契数列递归实现

int Fibonacci(int n)
{
    if(n==1)
        return 1;
    if(n==2)
        return 1;
    return Fibonacci(n-1)+Fibonacci(n-2);
}

关于斐波那契数列:点击这里

4.汉诺塔问题的递归实现

 #include<stdio.h>
void move(int n, char x, char y, char z)//将n个圆盘从x柱子上借助y柱子移动到z柱子上
{
     if(n == 1)
     	printf("圆盘编号 %d :从 %c 移动到 %c\n",n,x,z);
     else
     {
         move(n-1,x,y,z);
         printf("圆盘编号 %d:从 %c 移动到 %c\n",n,x,z);
         move(n-1,y,x,z);
      }
 }
int main()
{
    int n;//n代表圆盘的个数
    /*A,B,C分别代表三个柱子*/
    char ch1 = 'A';
    char ch2 = 'B';
    char ch3 = 'C';
 
     printf("请输入圆盘的个数:");
     scanf("%d",&n);
     move(n,ch1,ch2,ch3);
     return 0;
}

关于汉诺塔问题:点击这里

【例题】

1.普通

  1. 数的计算(洛谷-P1028):点击这里
    同题:数的计数(信息学奥赛一本通-T1316):点击这里
  2. 放苹果(信息学奥赛一本通-T1206):点击这里
  3. 鸣人的影分身(信息学奥赛一本通-T1303):点击这里
  4. 进制转换(洛谷-P1017):点击这里
  5. Pell数列(信息学奥赛一本通-T1202):点击这里
  6. 黑白棋子的移动(信息学奥赛一本通-T1327):点击这里
  7. 判断元素是否存在(信息学奥赛一本通-T1211):点击这里
  8. 汉诺塔问题(信息学奥赛一本通-T1205):点击这里
  9. 分解因数(信息学奥赛一本通-T1200):点击这里
  10. 因子分解(信息学奥赛一本通-T1210):点击这里
  11. 分数求和(信息学奥赛一本通-T1209):点击这里
  12. 求最大公约数问题(信息学奥赛一本通-T1207):点击这里

2.其他

  1. 火柴棒等式(洛谷-P1149)(打表递归)点击这里
  2. 逆波兰表达式(信息学奥赛一本通-T1198)(atof()函数的使用)点击这里
  3. 选数(洛谷-P1036)(递归+素数判断)点击这里
  4. 幂次方(洛谷-P1010)(递归+整数分解)点击这里
    同题:2的幂次方表示(信息学奥赛一本通-T1208):点击这里
  5. Xor Sum(AtCoder-2272)(map+打表)点击这里
  6. 石头剪刀布(2019牛客寒假算法基础集训营 Day6-F)(字典序)点击这里
  7. Formurosa(CF-217C)(位运算)点击这里
  8. fraction(HDU-6624)(数学推导+递归)点击这里
  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值